import sqlite3


def get_table_structure(conn, table_name):
    """获取表结构

    参数:
    conn: 数据库连接对象
    table_name: 表名

    返回:
    表结构信息列表
    """
    cursor = conn.cursor()
    cursor.execute(f"PRAGMA table_info({table_name})")
    # print(cursor.fetchall())
    return cursor.fetchall()


def get_table_data(conn, table_name):
    """获取表数据

    参数:
    conn: 数据库连接对象
    table_name: 表名

    返回:
    表数据列表
    """
    cursor = conn.cursor()
    try:
        cursor.execute(f"SELECT * FROM {table_name}")
        return cursor.fetchall()
    except sqlite3.OperationalError as e:
        print(f"无法获取表数据: {table_name}, 错误: {e}")
        return []


def compare_table_structure(conn1, conn2, table_name):
    """对比表结构

    参数:
    conn1: 第一个数据库连接对象
    conn2: 第二个数据库连接对象
    table_name: 表名

    返回:
    如果表结构一致返回True，否则返回False
    """
    try:
        structure1 = get_table_structure(conn1, table_name)
        structure2 = get_table_structure(conn2, table_name)
        if structure1 != structure2:
            print(f"表结构不一致: {table_name}")
            return False
        return True
    except sqlite3.OperationalError as e:
        print(f"无法比较表结构: {table_name}, 错误: {e}")
        return False


def compare_table_data(conn1, conn2, table_name):
    """对比表数据

    参数:
    conn1: 第一个数据库连接对象
    conn2: 第二个数据库连接对象
    table_name: 表名

    返回:
    如果表数据一致返回True，否则返回False
    """
    try:
        data1 = get_table_data(conn1, table_name)
        data2 = get_table_data(conn2, table_name)
        if data1 != data2:
            print(f"表数据不一致: {table_name}")
            return False
        return True
    except sqlite3.OperationalError as e:
        print(f"无法比较表数据: {table_name}, 错误: {e}")
        return False


def get_all_tables(conn):
    """获取数据库中所有表名

    参数:
    conn: 数据库连接对象

    返回:
    表名列表
    """
    cursor = conn.cursor()
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    return [row[0] for row in cursor.fetchall()]


def compare_databases(database1_path, database2_path):
    """对比两个数据库中所有表的结构和数据

    参数:
    database1_path: 第一个数据库文件路径
    database2_path: 第二个数据库文件路径
    """
    conn1 = sqlite3.connect(database1_path)
    conn2 = sqlite3.connect(database2_path)

    try:
        tables1 = get_all_tables(conn1)
        tables2 = get_all_tables(conn2)

        common_tables = set(tables1) & set(tables2)
        only_in_db1 = set(tables1) - set(tables2)
        only_in_db2 = set(tables2) - set(tables1)

        if only_in_db1:
            print(f"以下表仅存在于第一个数据库中: {only_in_db1}")
            for table_name in sorted(only_in_db1):
                print(f"表 '{table_name}' 仅存在于第一个数据库中，无法进行比较。")

        if only_in_db2:
            print(f"以下表仅存在于第二个数据库中: {only_in_db2}")
            for table_name in sorted(only_in_db2):
                print(f"表 '{table_name}' 仅存在于第二个数据库中，无法进行比较。")

        for table_name in sorted(common_tables):
            structure_ok = compare_table_structure(conn1, conn2, table_name)
            data_ok = compare_table_data(conn1, conn2, table_name)
            if structure_ok and data_ok:
                print(f"表 '{table_name}' 的结构和数据一致。")
    finally:
        conn1.close()
        conn2.close()


if __name__ == "__main__":
    try:
        db1_path = r"C:\Users\leixin\Desktop\DB\BurstApp.db"
        db2_path = r"C:\Users\leixin\Desktop\DB\D.db"
        compare_databases(db1_path, db2_path)
    except Exception as e:
        print(f"发生异常: {e}")